package com._2048;

import com.common.GameBoard;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

// 主窗口
class MainWindow extends JFrame implements ActionListener, Game.Callback, KeyListener {
    private final JButton mButtonStart; // "开始"按钮
    private final Game mGame;           // 游戏

    /**
     * 构造方法。
     */
    public MainWindow() {
        // 设置当单击右上角的X按钮时退出程序
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 设置窗口标题
        super.setTitle(Const.getString("IDS_APP_NAME"));

        // 设置窗口尺寸不能改变
        super.setResizable(false);

        // 设置窗口尺寸
        super.setSize(Const.WIDTH, Const.HEIGHT);

        // 设置窗口居中
        super.setLocationRelativeTo(null);

        // 设置窗口布局
        super.setLayout(null);

        // 监听键盘事件
        super.addKeyListener(this);

        // 设置"开始"按钮
        mButtonStart = new JButton(Const.getString("IDS_START"));
        mButtonStart.setBounds(Const.BUTTON_START_BOUNDS);
        mButtonStart.addActionListener(this);
        super.add(mButtonStart);

        // 创建游戏区域
        final GameBoard gameBoard = new GameBoard(this, Const.GAME_BOARD_X, Const.GAME_BOARD_Y, Const.GAME_BOARD_WIDTH, Const.GAME_BOARD_HEIGHT);

        // 创建游戏
        mGame = new Game(this, gameBoard.getDrawer(), gameBoard);
    }

    /**
     * 所有按钮的单击响应方法。
     * @param e 事件相关信息
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        final Object source = e.getSource();
        if (source == mButtonStart) {
            this.onButtonStartClicked();
        }

        // 按完按钮后，让焦点回到窗口，否则不能响应键盘事件
        super.requestFocus();
    }
    
    /**
     * 按键事件的响应方法。
     * @param e 事件相关信息
     */        
    @Override
    public void keyPressed(KeyEvent e) {
        mGame.onKeyPressed(e.getKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    /**
     * "开始"按钮的单击响应方法。
     */
    private void onButtonStartClicked() {
        mButtonStart.setText(Const.getString("IDS_RESTART"));
        mGame.start();
    }

    /**
     * 游戏结束事件的响应方法。
     * @param isWon 胜利则为 true，否则为 false
     */
    @Override
    public void onGameOver(boolean isWon) {
        if (isWon) {
            JOptionPane.showMessageDialog(this, Const.getString("IDS_WON"), " ", JOptionPane.INFORMATION_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(this, Const.getString("IDS_LOST"), " ", JOptionPane.INFORMATION_MESSAGE);
        }
        
        mButtonStart.setText(Const.getString("IDS_START"));
    }
}
